从部署的用于实时推理的模型中收集生产数据(预览版)

您所在的位置:网站首页 pip install 升级 从部署的用于实时推理的模型中收集生产数据(预览版)

从部署的用于实时推理的模型中收集生产数据(预览版)

2023-06-02 17:10| 来源: 网络整理| 查看: 265

你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn。

从部署的用于实时推理的模型中收集生产数据(预览版) 项目 05/23/2023

适用范围:Azure CLI ml 扩展 v2(最新版)Python SDK azure-ai-ml v2(最新版)

在本文中,你将了解如何从部署到 Azure 机器学习托管联机终结点或 Kubernetes 联机终结点的模型中收集生产推理数据。

重要

此功能目前处于公开预览状态。 此预览版在提供时没有附带服务级别协议,不建议将其用于生产工作负荷。 某些功能可能不受支持或者受限。 有关详细信息,请参阅 Microsoft Azure 预览版补充使用条款。

Azure 机器学习数据收集器在 Azure Blob 存储中记录推理数据。 可以为新的或现有的联机终结点部署启用数据收集。

使用所提供的 Python SDK 收集的数据将自动注册为 Azure 机器学习工作区中的数据资产。 此数据资产可用于监控模型。

如果你想要收集部署到实时终结点的 MLFlow 模型的生产推理数据,只需一次切换即可完成。 要了解如何执行此操作,请参阅 MLFlow 模型的数据收集。

先决条件 Azure CLI Python

在按照本文中的步骤操作之前,请确保满足以下先决条件:

Azure CLI 和 Azure CLI 的 ml 扩展。 有关详细信息,请参阅安装、设置和使用 CLI (v2)。

重要

本文中的 CLI 示例假定你使用的是 Bash(或兼容的)shell。 例如,从 Linux 系统或者适用于 Linux 的 Windows 子系统。

Azure 机器学习工作区。 如果没有,请使用安装、设置和使用 CLI (v2) 中的步骤创建一个。

Azure 基于角色的访问控制 (Azure RBAC) 用于授予对 Azure 机器学习中的操作的访问权限。 若要执行本文中的步骤,必须为用户帐户分配 Azure 机器学习工作区的所有者或参与者角色,或者分配一个允许 Microsoft.MachineLearningServices/workspaces/onlineEndpoints/* 的自定义角色。 有关详细信息,请参阅管理对 Azure 机器学习工作区的访问。

适用于:Python SDK azure-ai-ml v2(当前版本)

在按照本文中的步骤操作之前,请确保满足以下先决条件:

Azure 机器学习工作区。 如果没有,请使用快速入门:创建工作区资源一文中的步骤创建一个。

若要安装 Python SDK v2,请使用以下命令:

pip install azure-ai-ml azure-identity

要将 SDK 的现有安装更新到最新版本,请使用以下命令:

pip install --upgrade azure-ai-ml azure-identity

有关详细信息,请参阅安装适用于 Azure 机器学习的 Python SDK v2。

Azure 基于角色的访问控制 (Azure RBAC) 用于授予对 Azure 机器学习中的操作的访问权限。 若要执行本文中的步骤,必须为用户帐户分配 Azure 机器学习工作区的所有者或参与者角色,或者分配一个允许 Microsoft.MachineLearningServices/workspaces/onlineEndpoints/* 的自定义角色。 有关详细信息,请参阅管理对 Azure 机器学习工作区的访问。

拥有可用于部署的已注册模型。 如果你尚未注册模型,请参阅将你的模型注册为机器学习中的资产。

创建 Azure 机器学习联机终结点。 如果你没有现有的联机终结点,请参阅使用联机终结点部署机器学习模型并对其进行评分。

执行模型监视的自定义日志记录

使用自定义日志记录的数据收集允许你在任何数据转换之前、期间和之后直接从记分脚本记录 Pandas DataFrame。 通过自定义日志记录,表格数据将实时记录到工作区 Blob 存储中,模型监控器可以在工作区 Blob 存储中无缝地使用这些数据。

使用自定义日志记录代码更新评分脚本

首先,你需要将自定义日志记录代码添加到评分脚本 (score.py)。 对于自定义日志记录,你将需要 azureml-ai-monitoring 包。 有关更多信息,请参阅 数据收集 SDK 的 PyPI 页面。

通过将以下行添加到评分脚本的顶部来导入 azureml-ai-monitoring 包:

from azureml.ai.monitoring import Collector

在 init() 函数中声明数据收集变量(最多五个):

注意

如果你对 Collector 对象使用名称 model_inputs 和 model_outputs,模型监控系统将自动识别自动注册的数据资产,这将提供更加无缝的模型监控体验。

global inputs_collector, outputs_collector inputs_collector = Collector(name='model_inputs') outputs_collector = Collector(name='model_outputs')

默认情况下,如果在数据收集过程中失败,Azure 机器学习会引发异常。 (可选)可以使用 on_error 参数指定在发生日志记录失败时要运行的函数。 例如,在以下代码中使用 on_error 参数,Azure 机器学习将记录错误,而不是抛出异常:

inputs_collector = Collector(name='model_inputs', on_error=lambda e: logging.info("ex:{}".format(e)))

在 run() 函数中,使用 collect() 函数记录评分前后的数据帧。 第一次调用 collect() 返回 context,其中包含稍后关联模型输入和模型输出的信息。

context = inputs_collector.collect(data) result = model.predict(data) outputs_collector.collect(result, context)

注意

目前,只能使用 collect() API 记录 Pandas DataFrame。 如果数据在传递 collect() 到时不在 DataFrame 中,则不会将其记录到存储中,并将报告错误。

以下代码是使用自定义日志记录 Python SDK 的完整评分脚本 (score.py) 的示例:

import pandas as pd import json from azureml.ai.monitoring import Collector def init(): global inputs_collector, outputs_collector # instantiate collectors with appropriate names, make sure align with deployment spec inputs_collector = Collector(name='model_inputs') outputs_collector = Collector(name='model_outputs') def run(data): # json data: { "data" : { "col1": [1,2,3], "col2": [2,3,4] } } pdf_data = preprocess(json.loads(data)) # tabular data: { "col1": [1,2,3], "col2": [2,3,4] } input_df = pd.DataFrame(pdf_data) # collect inputs data, store correlation_context context = inputs_collector.collect(input_df) # perform scoring with pandas Dataframe, return value is also pandas Dataframe output_df = predict(input_df) # collect outputs data, pass in correlation_context so inputs and outputs data can be correlated later outputs_collector.collect(output_df, context) return output_df.to_dict() def preprocess(json_data): # preprocess the payload to ensure it can be converted to pandas DataFrame return json_data["data"] def predict(input_df): # process input and return with outputs ... return output_df 更新依赖项

在使用更新的评分脚本创建部署之前,你将使用基本图像 mcr.microsoft.com/azureml/openmpi4.1.0-ubuntu20.04 和适当的 Conda 依赖项创建环境,然后使用以下 YAML 中的规范构建环境。

channels: - conda-forge dependencies: - python=3.8 - pip=22.3.1 - pip: - azureml-defaults==1.38.0 - azureml-ai-monitoring~=0.1.0b1 name: model-env 更新部署 YAML

接下来,我们将创建部署 YAML。 包括 data_collector 属性并为 model_inputs 和 model_outputs 启用收集,这是我们之前通过自定义日志 Python SDK 为 Collector 对象指定的名称:

data_collector: collections: model_inputs: enabled: 'True' model_outputs: enabled: 'True'

以下代码是用于托管联机终结点部署的综合部署 YAML 的示例。 你应该根据自己的方案来更新部署 YAML。

$schema: https://azuremlschemas.azureedge.net/latest/managedOnlineDeployment.schema.json name: blue endpoint_name: my_endpoint model: azureml:iris_mlflow_model@latest environment: image: mcr.microsoft.com/azureml/openmpi4.1.0-ubuntu20.04 conda_file: model/conda.yaml code_configuration: code: scripts scoring_script: score.py instance_type: Standard_F2s_v2 instance_count: 1 data_collector: collections: model_inputs: enabled: 'True' model_outputs: enabled: 'True'

(可选)可以为 data_collector 调整以下附加参数:

data_collector.rolling_rate:对存储中的数据进行分区的速率。 值可以是:Minute、Hour、Day、Month 或 Year。 data_collector.sampling_rate:要收集的数据的百分比,以十进制比率表示。 例如,值 1.0 表示收集 100% 的数据。 data_collector.collections..data.name:要与收集的数据一起注册的数据资产的名称。 data_collector.collections..data.path:完整的 Azure 机器学习数据存储路径,其中收集的数据应注册为数据资产。 data_collector.collections..data.version:要与 Blob 存储中收集的数据一起注册的数据资产的版本。

在启用自定义日志记录的情况下部署模型:

$ az ml online-deployment create -f deployment.YAML

有关如何使用 Kubernetes 联机终结点格式化部署 YAML 以进行数据收集(以及默认值)的更多信息,请参阅 CLI (v2) 已启用 Azure ARC 的 Kubernetes 联机部署 YAML 模式。 有关如何格式化部署 YAML 以使用托管联机终结点进行数据收集的详细信息,请参阅 CLI (v2) 托管联机部署 YAML 架构。

将收集的数据存储在 Blob 中

Blob 存储输出/格式

默认情况下,收集的数据将存储在工作区 Blob 存储的以下路径中:azureml://datastores/workspaceblobstore/paths/modelDataCollector。 Blob 中的最终路径将附加 {endpoint_name}/{deployment_name}/{collection_name}/{yyyy}/{MM}/{dd}/{HH}/{instance_id}.jsonl。 文件中的每一行都是一个 JSON 对象,表示已记录的单个推理请求/响应。

注意

collection_name 指的是 MDC 数据采集名称(例如,“model_inputs”或“model_outputs”)。 instance_id 是标识记录的数据分组的唯一 ID。

收集的数据将遵循以下 JSON 架构。 可从 data关键值中获得收集的数据,并且系统提供附加元数据。

{"specversion":"1.0", "id":"725aa8af-0834-415c-aaf5-c76d0c08f694", "source":"/subscriptions/636d700c-4412-48fa-84be-452ac03d34a1/resourceGroups/mire2etesting/providers/Microsoft.MachineLearningServices/workspaces/mirmasterws/onlineEndpoints/localdev-endpoint/deployments/localdev", "type":"azureml.inference.inputs", "datacontenttype":"application/json", "time":"2022-12-01T08:51:30Z", "data":[{"label":"DRUG","pattern":"aspirin"},{"label":"DRUG","pattern":"trazodone"},{"label":"DRUG","pattern":"citalopram"}], "correlationid":"3711655d-b04c-4aa2-a6c4-6a90cbfcb73f","xrequestid":"3711655d-b04c-4aa2-a6c4-6a90cbfcb73f", "modelversion":"default", "collectdatatype":"pandas.core.frame.DataFrame", "agent":"monitoring-sdk/0.1.2", "contentrange":"bytes 0-116/117"}

注意

显示换行符只是为了便于阅读。 在收集的.jsonl 文件中,不会有任何换行符。

存储大型有效负载

如果数据的有效负载大于 256 KB,则 {endpoint_name}/{deployment_name}/request/.../{instance_id}.jsonl 路径中包含的 {instance_id}.jsonl 文件中将有一个事件指向原始文件路径,该文件的路径如下:blob_url/{blob_container}/{blob_path}/{endpoint_name}/{deployment_name}/{rolled_time}/{instance_id}.jsonl。 收集的数据将存在于此路径中。

存储二进制数据

对于收集的二进制数据,我们直接显示原始文件,并将 instance_id 作为文件名。 根据 rolling_rate,二进制数据放置在与请求源组路径相同的文件夹中。 以下示例反映数据字段中的路径。 格式为 JSON,显示换行符只是为了便于阅读:

{ "specversion":"1.0", "id":"ba993308-f630-4fe2-833f-481b2e4d169a", "source":"/subscriptions//resourceGroups//providers/Microsoft.MachineLearningServices/workspaces/ws/onlineEndpoints/ep/deployments/dp", "type":"azureml.inference.request", "datacontenttype":"text/plain", "time":"2022-02-28T08:41:07Z", "data":"https://masterws0373607518.blob.core.windows.net/modeldata/mdc/%5Byear%5D%5Bmonth%5D%5Bday%5D-%5Bhour%5D_%5Bminute%5D/ba993308-f630-4fe2-833f-481b2e4d169a", "path":"/score?size=1", "method":"POST", "contentrange":"bytes 0-80770/80771", "datainblob":"true" } 在工作室 UI 中查看数据

要从工作室 UI 查看 Blob 存储中收集的数据,请执行以下操作:

转到 Azure 机器学习工作区中的“数据”选项卡:

导航到“数据存储”并选择你的 workspaceblobstore(默认):

使用“浏览”菜单查看收集的生产数据:

日志有效负载

除了使用提供的 PythonSDK 自定义日志记录外,你还可以直接收集请求和响应 HTTP 有效负载数据,而无需扩展评分脚本 (score.py)。 要启用有效负载日志记录,请在部署 YAML 中使用名称 request 和 response:

$schema: http://azureml/sdk-2-0/OnlineDeployment.json endpoint_name: my_endpoint name: blue model: azureml:my-model-m1:1 environment: azureml:env-m1:1 data_collector: collections: request: enabled: 'True' response: enabled: 'True'

在启用有效负载日志记录的情况下部署模型:

$ az ml online-deployment create -f deployment.YAML

注意

使用有效负载日志记录时,不能保证收集的数据为表格格式。 因此,如果你希望在模型监控中使用收集的有效负载数据,则需要提供一个预处理组件来使数据表格化。 如果想要体验无缝模型监控,我们建议你使用自定义日志 Python SDK。

使用部署时,收集的数据将流向工作区 Blob 存储。 以下代码是 HTTP 请求收集的 JSON 的示例:

{"specversion":"1.0", "id":"19790b87-a63c-4295-9a67-febb2d8fbce0", "source":"/subscriptions/d511f82f-71ba-49a4-8233-d7be8a3650f4/resourceGroups/mire2etesting/providers/Microsoft.MachineLearningServices/workspaces/mirmasterenvws/onlineEndpoints/localdev-endpoint/deployments/localdev", "type":"azureml.inference.request", "datacontenttype":"application/json", "time":"2022-05-25T08:59:48Z", "data":{"data": [ [1,2,3,4,5,6,7,8,9,10], [10,9,8,7,6,5,4,3,2,1]]}, "path":"/score", "method":"POST", "contentrange":"bytes 0-59/*", "correlationid":"f6e806c9-1a9a-446b-baa2-901373162105","xrequestid":"f6e806c9-1a9a-446b-baa2-901373162105"}

而以下代码是 HTTP 响应收集的 JSON 的示例:

{"specversion":"1.0", "id":"bbd80e51-8855-455f-a719-970023f41e7d", "source":"/subscriptions/d511f82f-71ba-49a4-8233-d7be8a3650f4/resourceGroups/mire2etesting/providers/Microsoft.MachineLearningServices/workspaces/mirmasterenvws/onlineEndpoints/localdev-endpoint/deployments/localdev", "type":"azureml.inference.response", "datacontenttype":"application/json", "time":"2022-05-25T08:59:48Z", "data":[11055.977245525679, 4503.079536107787], "contentrange":"bytes 0-38/39", "correlationid":"f6e806c9-1a9a-446b-baa2-901373162105","xrequestid":"f6e806c9-1a9a-446b-baa2-901373162105"} 收集 MLFlow 模型的数据

如果你将 MLFlow 模型部署到 Azure 机器学习联机终结点,则可以通过在工作室 UI 中进行一次切换来启用生产推理数据收集。 如果数据收集已打开,我们将使用自定义日志记录代码自动检测你的评分脚本,以确保将生产数据记录到你的工作区 Blob 存储中。 然后,模型监控器便可以使用这些数据来监控生产中 MLFlow 模型的性能。

要在部署模型时启用生产数据收集,请在“部署”选项卡下面为“数据收集(预览版)”选择“已启用”。

启用数据收集后,生产推理数据将记录到你的 Azure 机器学习工作区 Blob 存储中,并将创建两个数据资产,名称分别为 --model_inputs 和 --model_outputs。 当你的部署在生产中使用时,这些数据资产将实时更新。 然后,模型监控器可以使用数据资产来监控生产中模型的性能。

后续步骤

要了解如何使用收集的生产推理数据监视模型的性能,请参阅以下文章:

什么是 Azure 机器学习终结点?


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3